<?php
declare(strict_types=1);

namespace Zlf\AppCalculation\Traits;

use Exception;

trait Common
{

    /**
     * @var string 算式
     */
    private string $formula;

    /**
     * 初始化
     * @param string $formula
     */
    public function __construct(string $formula)
    {
        $this->formula = $formula;
    }


    /**
     * @describe 检查表达式
     * @return void
     * @throws Exception
     * @user zlf zms-pro@qq.com 2025/1/10
     */
    private function validityCheckOfEquations(): void
    {
        //判断括号后面是否有运算符,没有就是错误的运算符
        $pattern = '/\)\s*\d+/'; // 匹配 ) 后面可有零个或多个空格后跟着一个或多个数字
        if (preg_match($pattern, $this->formula)) {
            throw new Exception("运算式错误");
        }

        //括号未闭合,非成对出现
        if (substr_count($this->formula, ')') !== substr_count($this->formula, '(')) {
            throw new Exception("运算式表达式错误");
        }
    }


    /**
     * @describe 计算算式
     * @param string $formula
     * @param int|null $precision
     * @return float
     * @throws Exception
     * @user zlf zms-pro@qq.com 2025/1/10
     */
    public static function compute(string $formula, ?int $precision = null): float
    {
        $value = (new self($formula))->startCount();
        if (is_null($precision)) {
            return $value;
        }
        return round($value, $precision);
    }
}